iT邦幫忙

2024 iThome 鐵人賽

DAY 7
0
佛心分享-刷題不只是刷題

Ruby刷題:沒那麼痛苦的痛苦面具系列 第 16

DAY 16:3 Sum 拼拼湊湊雜湊表!

  • 分享至 

  • xImage
  •  

•̀ω•́)つ
嗨,我是wec,今天是DAY 16。

🔎 題目難度與描述

難度:MEDIUM

題目描述:

給定一個包含n個整數的數組nums,判斷是否存在三個數字,使它們的和為0。找出所有不重複的三元組。

🔎 解題思路&程式碼

1️⃣ 雙指針

第1步: 先對nums做排序,然後使用變數i從 0 遍歷到 n-2。對於每個i,把nums[i]當作基準數。如果nums[i]與前一個元素相同則跳過,避免重複。
第2步: 定義兩個指針,left指向 i + 1,right指向 n - 1。如果三個數字和為0則記錄下來並調整leftright(跳過重複的元素)。
第3步: 如果和小於 0,移動left向右。如果和大於 0,移動right向左。兩者相遇時停止。
程式碼:

def three_sum(nums)
  nums.sort!
  result = []

  nums.each_with_index do |num, i|
    next if i > 0 && num == nums[i - 1]

    left, right = i + 1, nums.length - 1

    while left < right
      sum = num + nums[left] + nums[right]
      if sum == 0
        result << [num, nums[left], nums[right]]
        left += 1
        right -= 1
        left += 1 while left < right && nums[left] == nums[left - 1]
        right -= 1 while left < right && nums[right] == nums[right + 1]
      elsif sum < 0
        left += 1
      else
        right -= 1
      end
    end
  end

  result
end

🔎 總結

時間複雜度

雙指針: 時間複雜度為O(n²),n為組數長度。
➡️ 這種方法的應用其實很廣泛,尤其在需要從大量資料中尋找匹配對象時,都可以考慮通過排序+雙指針來節省時間。例如在檢查文件夾大小、尋找一組數值的匹配等問題中,也可以用相似的思維來優化演算法喔! /ᐠ-˕-マⳊ

那麽,以上就是今天的內容!

相信IT人動腦時都要吃點東西,所以今天邊寫邊吃水蜜桃果凍。
明天要說:Ruby精選刷題!Medium路跑D-9(>∀・)⌒☆


上一篇
DAY 15:Lowest Common Ancestor of a Binary Tree 練練二元樹!
下一篇
DAY 17: 4 Sum 拼拼湊湊雜湊表!
系列文
Ruby刷題:沒那麼痛苦的痛苦面具30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言